Date		:	11 aout 1991
		Protection	:	MOT DE PASSE
		Programme	:       XENOMORPHE
		Outils		:	SOFT-ICE V2.50
		Fichier		:	XENO.EXE
		Temps pass�	:	1 HEURE
		Soci�t�		:	PANDORA
		Divers	        :	CREATION DE FRED6.COM
				:       et le septi�me ce week-end !
		Origine		:	INDONESIE
		Num�ro		:	126

	
	Une protection disquette plus une protection mot de passe ! 
	Je d�cide de m'attaquer � la protection mot de passe pour commencer.
	Les caract�res sont demand�s par l'INT 21 sous-fonction 07.
	Le test de la touche ENTER se fait en:

	36D0:8807 CD21	INT	21
	36D0:8809 3C0D	CMP	AL,0D
	36D0:880B 7456	JZ	8863

	Premi�re constatation; ce programme se modifie largement lui-m�me
	en fonction de la r�ponse. ( modification par des MOV CS:[xxxx],yyyy )
	Si on ne r�pond rien � la demande de mot de passe ( touche ENTER seule )
	on sort du programme imm�diatement car une instruction CWD fait un
	" pont " entre deux sous-programmes. ( le deuxi�me sous-programme sort
	vers le DOS ).
	Et dans le cas o� on rentre au moins un caract�re avant d'appuyer sur
	ENTER on se trouve avec une instruction RET � cet endroit:

	36D0:88AF 750A	     JNZ 88BB	 ; � supprimer par un XOR BX,BX ( 33DB )
	36D0:88B1 81C3613F   ADD BX,3F61 ; on doit retrouver 3F61 en BX
	36D0:88B5 2E89BF7502 MOV CS:[BX+0275],DI
	36D0:88BA C3	     RET         ; Ici on trouve un 99 ( CWD ) si on ne
					 ; tape pas au moins un caract�re.	

	Le contenu de BX est test� juste avant le saut conditionnel en 88AF.
	Le contenu de BX doit �tre � zero pour que le programme fonctionne
	correctement et que l'on passe par 88B1 afin de recharger BX avec 3F61.
	Donc deux op�rations � effectuer:

	1) forcer le saut en 88AF pour qu'il passe en 88B1.
	2) s'assurer que le contenu de BX contienne zero avant l'addition ou
	   bien transformer le ADD BX,3F61 en MOV BX,3F61.

	Il faut �videment que le nombre des octets composant les nouvelles
	instructions soit identique � celui des instructions � remplacer.
	Une solution �l�gante permet de faire d'une pierre deux coups puisqu'en
	pla�ant un XOR BX,BX � la place du saut JNZ 88BB je supprime le saut
	et je mets le contenu de BX � zero !

	Un autre probl�me survient; la chaine d'octet fait parti de la
	protection disquette et ne se trouve donc nul part en clair.
	Il ne reste plus qu'� appliquer la solution du d�tournement d'IT.
	L'INT 21 sous-fonction 07 ( attente de caract�re vanant du clavier )
	est appel�e juste avant la demande du mot de passe.
	FRED6.COM est vite cr�e puisqu'il suffit de prendre un ancien FRED.COM
	et de modifier la valeur de IP cherch�, le mot � trouver � cette
	position et le nouveau mot � y mettre ( remplacer 750A par 33DB ).

 ;	PATCH POUR LE PROGRAMME XENOMORPHE
 ;	FREDDY_SOFT

 code      segment
           org    100h
           assume cs:code

 start:    jmp    installe	; On va installer la routine r�sidente...

 cr        equ    0dh
 lf        equ    0ah
 flag      equ    07h    ; Contenu de AH devant �tre test�.
 adr_ip    equ    88afh  ; En CS:88af il suffit de mettre 33db. ( XOR BX,BX )
 patch     equ    0db33h ; � mettre � la place de 750A en CS:88afh
 			 ; Note: toujours inverser l'octet fort et faible
			 ; ....Standard INTEL !

 instok    db     cr,lf,'    D�tournement de l',39,'INT 21 sous-fonction 07'
	   db     cr,lf
	   db     '                  ....FREDDY_SOFT....','$'
 drap      db     0,0
 elimine   db     cr,lf,'J',39,'ai en principe tout remis en l',39,'�tat....'
	   db     cr,lf,'$'

 int21     label  dword	; sauvegarde des adresses SEG:OFF de l'INT21 d'origine
 i40off    db     0,0	; OFFSET
 i40seg    db     0,0	; SEGMENT

 tsrint40  proc   far
           jmp short apr�s_id
	   db    'FR'	; On intercalle au d�but du code un identificateur
 apr�s_id: sti		; qui permettra de savoir si le programme est l� !
           nop 
	   push ds
	   push es
	   push di
	   push si
	   push dx
           push cx
	   push bx
	   push ax
	   cmp byte ptr [drap],1	; Si 1 on devient transparent.
	   jz suite	; Saut � l'INT 21 toutes fonctions valid�es.
	   cmp ah,flag	; AH = 07.
	   jnz suite	; Si non on traite les INT 21 normalement.
	   mov ax,sp	; On sauve SP dans un registre, ici AX.
	   mov cx,20	; On essaie une vingtaine de fois...
incr:      pop ds	; Pour trouver le bon segment CS...
           dec cx
	   jz s  	; Si au bout de vingt fois on a pas r�ussi on sort...
	   cmp word ptr ds:[adr_ip],0a75h ; en CS:88AF on a 750A.
           jnz incr     
           mov word ptr ds:[adr_ip],patch
	   mov byte ptr [drap],1h
s:         mov sp,ax	; On remet SS:SP d'origine.
suite:	   pop ax	; On restaure tous les registres
	   pop bx
	   pop cx
	   pop dx
	   pop si
	   pop di
	   pop es
	   pop ds 
           pushf	; Pushf et puis un CALL pour appeler l'INT 21 ceci
           cli		; pour simuler une instruction INT.
	   call   int21	; Appel de l'INT21 officielle.
 fin:	   sti
           ret    2     ; et on revient
 tsrint40  endp
 eor:

 ; ROUTINE D'INSTALLATION

 installe: mov    ax,3521h
	   int    21h
           cmp word ptr es:[bx+2],'RF'	; On teste la pr�sence de la signature.
           je     away                  ; si pr�sent on d�sinstalle.
	   mov    ax,cs			; CS --> DS
           mov    ds,ax			; DS = CS
           mov    ax,3521h              ; on detourne l'int 21h.
           int    21h			; sous-fonction 35.
           mov    word ptr [i40off],bx  ; L'offset se retrouve en BX.
           mov    i40seg,es		; Le segment en ES.
           mov    ax,2521h              ; Et on met l'ad. du resident
           mov    dx,offset tsrint40	; sous-fonction 25 dont SEG:OFF se
           int    21h			; trouve en DX <---( tsrint40 ).
           mov    dx,offset instok      ; Offset du message de fin.
           mov    ah,09			; Sorti du message...
           int    21h
           mov    ah,07			; Attente d'un caract�re au clavier.
	   int    21h
           mov    dx,eor-start+100h+15	; On r�serve la m�moire qui doit rester
           mov    cl,4			; en r�sident: DEBUT code - FIN code +
           shr    dx,cl			; 100h + 15. ( 100h car les zones data
           mov    al,0			; sont plac�es de 0 � 100h dans un com.
					; Puis d�calage de 4 � droite pour avoir
					; le r�sultat en nombre de paragraphe 
					; + 1 ( ou + 15 comme ci-dessus ).
           mov    ah,31h                ; Sortie et reservation
           int    21h                   ; de la m�moire.
 away:     mov    dx,word ptr es:i40off	; Restauration de OFF:SEG de l'INT 21
           mov    ax,word ptr es:i40seg	; d'origine.
           mov    ds,ax
           mov    ax,2521h		; Set vecteur de l' INT 21
           int    21h
           mov    bx,es
           mov es,es:[2ch]
           mov ah,49h			; On lib�re la m�moire.
           int 21h
           mov es,bx
           mov ah,49h
           int 21h
           push cs			; Mettre CS dans DS 
           pop ds
           mov dx,offset elimine	; pointe sur d�but du message.
           xor al,al
           mov ah,9
           int 21h			; Sortir message.
           mov ah,4ch			
           int 21h			; On revient au DOS.
 code      ends
           end start